""""""
"""
______________________________
time：2021/6/2
用来实现传入参数数据中的参数化，使用正则表达式进行替换；
所有参数化的逻辑放入此文件中，集中调用集中管理；
______________________________

"""

import re
import time


class Parameterize:
    """参数化类"""
    """
    # 为了避免每一个接口都要在方法里面写正则规则,
    优化：待匹配字段优化为类属性，替换方法优化为类方法
    """
    re_supplier_pattern = r'{supplierno}'  # 供应商名称，新建时的参数化
    re_purcontractno_pattern = r'{purchase_contractno}'  # 采购合同新建时用到的采购合同编号参数化

    """怎么取得采购合同中关联供应商的数据呢？ 他们是在请求参数中的，如何获得请求参数中的数据呢？
    如果使用全局变量定义supid，两个文件互相导包时，就会陷入循环导入问题，类似于死循环一样，所以不能使用全局变量；
    较优方案：使用setattr，getattr,反射机制
    """
    re_purcontract_supid_ptn = r'{supplier_dataId}'  # 替换采购合同中的供应商id和供应商名称,注意id替换后要变为字符串？？？
    re_purcontract_supname_ptn = r'{supplier_name}'  # 替换采购合同中的供应商id和供应商名称
    re_purcontract_dataId_ptn = r'{pur_contract_dataId}'  # 新建采购合同的dataId

    @classmethod
    def to_param(cls, strdata):
        # 参数化：供应商名称不重复
        if re.search(cls.re_supplier_pattern, strdata):  # 先开始匹配，如果匹配的到再做替换
            replace_str = '小w供应商' + str(int(time.time()))  # 供应商名称参数化不重复
            strdata = re.sub(cls.re_supplier_pattern, replace_str, strdata)  # 如果匹配到则替换，并且覆盖原来的数据；如果没有匹配到则返回原始数据

        # 参数化：采购合同名称不重复
        if re.search(cls.re_purcontractno_pattern, strdata):
            replace_str = '小w采购合同编号' + str(int(time.time()))
            strdata = re.sub(cls.re_purcontractno_pattern, replace_str, strdata)

            # 接口依赖：关联供应商dataId
        if re.search(cls.re_purcontract_supid_ptn, strdata):
            supdataId = getattr(cls, "supplier_id")
            print(supdataId)
            strdata = re.sub(cls.re_purcontract_supid_ptn, str(supdataId), strdata)  # 第二个参数是字符串格式

        # 接口依赖：关联供应商名称
        if re.search(cls.re_purcontract_supname_ptn, strdata):
            strdata = re.sub(cls.re_purcontract_supname_ptn, getattr(cls, 'supplier_name'), strdata)

        # 接口依赖：采购合同的dataId
        if re.search(cls.re_purcontract_dataId_ptn, strdata):
            pur_contract_dataId = getattr(cls, "pur_contract_dataId")
            strdata = re.sub(cls.re_purcontract_dataId_ptn, str(pur_contract_dataId), strdata)

        # print("替换后的字符串：", strdata)
        return strdata


if __name__ == '__main__':
    # 新建供应商接口参数化
    str1 = '{"frontDev": "1","dataList": {"text_1": "{supplier_name}","form": 1166},"flag": true}'
    str2 = '{"frontDev": "1","dataList": {"text_1": "6.2供应商名称","form": 1166},"flag": true}'
    str3 = '{"frontDev": "1","dataList": {"text_1": "{name_id}","form": 1166},"flag": true}'
    str4 = '{"serialNo": "{purchase_contractno}","ownerId": [{"id": "273916061821944099","name": "吴青洁"}]}'
    # myparam = Parameterize() 优化为类属性类方法后不需要再用对象去调用
    # print(myparam.to_param(str1))
    # print(myparam.to_param(str2))
    # print(myparam.to_param(str3))
    # print(Parameterize.to_param(str1))
    # print(Parameterize.to_param(str2))
    # print(Parameterize.to_param(str3))
    print(Parameterize.to_param(str4))
